using UnityEngine;
using System.Collections;

public class Personnage
{
	#region Constante
	public const int MaxShield=50;
	#endregion
	
	#region Attributs et assesseur
    protected int id;
    public int Id
    {
        get { return id; }
    }

    protected string nom;
    public string Nom
    {
        get { return nom; }
    }
	private int pvMax;
	public int PvMax
    {
        get { return pvMax; }
		set { pvMax = value;}
    }
	
	protected int pv;
    public int Pv
    {
        get { return pv; }
		set { pv = value;}
    }
	
	protected int shield;
    public int Shield
    {
        get { return shield; }
		set { shield = value;}
    }
	
	private float nbRessourceMax;
	public float NbRessourceMax
	{
		get{ return nbRessourceMax ;}
		set{ nbRessourceMax = value;}
	}
	
	protected float nbRessource;
	public float NbRessource
	{
		get{ return nbRessource ;}
		set{ nbRessource = value;}
	}
	public Spells currentSpell;
    public Spells CurrentSpell
    {
        get { return currentSpell; }
		set { currentSpell = value;}
    }
	protected string msg;
	public string GetMessage
	{
		get { return msg; }
	}
	public Color CouleurHudRessource;//Rage : Orange ,Energie : Jaune,  Mana : Bleu
	#endregion
	
    public Personnage(int id=1, string nom="warrior", int health=200, int shield=0, int ressource=0, Spells currentSpell=null )
    {
        this.id = id;
        this.nom = nom;
		this.pv = health;
		this.pvMax = health;
		this.shield = shield;
		this.nbRessource    = ressource;
		this.nbRessourceMax = ressource;
		this.currentSpell = currentSpell;
		this.msg = "";
		if(id==1){
			CouleurHudRessource.a=1f;
			CouleurHudRessource.r=1f;
			CouleurHudRessource.g=0.5f;
			CouleurHudRessource.b=0f;
			this.nbRessourceMax = 100;
		}
		if(id==2){
			CouleurHudRessource.a=1f;
			CouleurHudRessource.r=0f;
			CouleurHudRessource.g=0f;
			CouleurHudRessource.b=1f;
		}
		if(id==3){
			CouleurHudRessource.a=1f;
			CouleurHudRessource.r=1f;
			CouleurHudRessource.g=1f;
			CouleurHudRessource.b=0f;
		}
    }
	public Personnage(Personnage Perso)
    {
        this.id = Perso.id;
        this.nom = Perso.nom;
		this.pv = Perso.pv;
		this.pvMax = Perso.pv;
		this.shield = Perso.shield;
		this.nbRessource    = Perso.nbRessource;
		this.nbRessourceMax = Perso.nbRessource;
		this.currentSpell = Perso.currentSpell;
		if(id==1){
			CouleurHudRessource.a=1f;
			CouleurHudRessource.r=1f;
			CouleurHudRessource.g=0.5f;
			CouleurHudRessource.b=0f;
			this.nbRessourceMax = 100;
		}
		if(id==2){
			CouleurHudRessource.a=1f;
			CouleurHudRessource.r=0f;
			CouleurHudRessource.g=0f;
			CouleurHudRessource.b=1f;
		}
		if(id==3){
			CouleurHudRessource.a=1f;
			CouleurHudRessource.r=1f;
			CouleurHudRessource.g=1f;
			CouleurHudRessource.b=0f;
		}
    }
	//
	//
	//Pourquoi return un booleen? pour savoir si le joueur à assez de ressource pour lancer le sort
	//return true si le joueur peut lancer le sort false sinon
	public bool DebutAction(Personnage Adversaire, Spells spell, ref int[] DamageDot, int CurrentTour){
		//Debug.LogWarning("Le spell "+spell.Name+" du "+nom+" est interrompu ? "+spell.IsInterrupt);
		if(this.nbRessource>=spell.Cost){
			currentSpell = new Spells(spell);
			this.nbRessource = this.nbRessource - spell.Cost;
			//Si le sort est canaliser ou instant
			//
			if(currentSpell.Instant==0 || currentSpell.Instant==1){
				msg = "Le "+nom+" charge une action de type "+spell.Type+" ca lui coute "+spell.Cost+" de ressource il lui reste "+this.nbRessource+" de ressource";
			}
			//Si mon spell est une defense et qu'il est instant
			//
			if(currentSpell.Instant==0){
				if(currentSpell.Type=="Defense"){
					if(currentSpell.IdSpell == 103){//Defense d'acier War
						msg = "Le "+nom+" se protege divisant par 2 les degats qui lui sont infliges et recuperant autant de rage que de degat qu'il devrai prendre";
					}
					if(currentSpell.IdSpell == 204){//Barriere Wiz
						msg = "Le "+nom+" met une barriere de protection + 25 shield";
						addShield(25);
					}
					if(currentSpell.IdSpell == 305){//Soin Thief
						msg = "Le "+nom+" se soigne + 20 pv, il lui reste "+NbRessource+" d'energie";
						GainPV(20);
					}
					if(currentSpell.IdSpell == 302){//Ponction de mana Thief
						if(Adversaire.Id==2){
							Adversaire.NbRessource = Adversaire.NbRessource-5;
							msg = "Le Voleur ponctionne 5 de mana";
						}
						else{
							msg = "Le Voleur n'a pas pu ponctionner de mana";
						}
					}
					if(currentSpell.IdSpell == 303){//Destabilisation Thief
						if(Adversaire.Id==1){
							Adversaire.NbRessource = Adversaire.NbRessource-5;
							msg = "Le Voleur ponctionne 5 de rage";
						}
						else{
							msg = "Le Voleur n'a pas pu ponctionner de rage";
						}
					}
				}
			}
			
			//Si le sort est un dot
			//
			if(currentSpell.Instant==2){
				GainRessource(currentSpell.Gain);
				msg = "Le "+nom+" realise une action de type DOT frappe en tout a "+currentSpell.Damage+" de dommage ca lui coute "+currentSpell.Cost+" de ressource il lui reste "+this.nbRessource+" de ressource";
				for(int i=0;i<spell.NbTour;i++){
					DamageDot[CurrentTour+i] = spell.getDamageDot(i);
					//Debug.LogWarning("spell.getDamageDot "+spell.getDamageDot(i));
				}
			}
			return true;
		}
		else{//pas assez de ressource pour lancer le sort
			msg = "Le "+nom+" commence a courir pour realiser son action et se votre la gueule il ne fait pas l'action de type "+spell.Type+", son sort coute "+spell.Cost+" de ressource il lui reste "+this.nbRessource+" de ressource";
			if(currentSpell!=null)
				currentSpell.IsInterrupt = true;
			return false;	
		}
	}
	//int ConstDamage ne sert que pour le Contre. Pour eviter au if Adversaire.currentSpell.ConstDamage==10 de comparer le spell qui a déja été baissé
	//
	public bool FinAction(Personnage Adversaire){
		if(currentSpell != null){
			//Debug.LogWarning("Le "+nom+" est il interrupt? FIN ACTION!!! "+currentSpell.IsInterrupt);
			if(!currentSpell.IsInterrupt){//si pas interrupt alors on fait le sort
				
				//Si le spell adverse est un contre alors baisse les dommage de 10
				//
				if(Adversaire.currentSpell!=null && !Adversaire.currentSpell.IsInterrupt){
					if(Adversaire.currentSpell.IdSpell==304 && currentSpell.IdSpell != 108 && currentSpell.IdSpell != 207)//Si le voleur adverse fait une illusion
						currentSpell.Damage = 0;
					if(Adversaire.currentSpell.IdSpell == 103){//Si le War fait une defense d'acier
						Debug.LogWarning("Le "+Adversaire.nom+" vien de se proteger divisant par 2 les degats. "+currentSpell.Damage/2+" de dommage lui sont infliges, il recupere autant de rage que de degat qu'il aurait du prendre "+currentSpell.ConstDamage);
						Adversaire.NbRessource = Adversaire.NbRessource + currentSpell.ConstDamage;
						currentSpell.Damage = currentSpell.Damage/2;
					}
					if(Adversaire.currentSpell.Type == "Contre" && (Adversaire.currentSpell.ConstDamage-Adversaire.currentSpell.Damage==0) && Adversaire.currentSpell.IdSpell!=304){
						currentSpell.Damage = currentSpell.Damage - 10;
					}
					
				}
				//Si mon spell est un contre et que le spell adverse tape a 10 alors je fait en fonction
				//
				if(currentSpell.Type=="Contre"){
					if(currentSpell.IdSpell ==304){//Contre special pour voleur
						Debug.LogWarning("@@@@@@@@@ Esquive Toute attaque sauf ultime @@@@@@@@");
					}
					else{
						//Debug.LogWarning("@@@@@@@@@@@@@@@@@@@ Mon spell est un contre. @@@@@@@@@@@@@@@@@@@ je suis le "+Nom);
						if(Adversaire.currentSpell!=null){
							//Debug.LogWarning("@@@@@@@@@ L'Adversaire me fait une attaque "+Adversaire.currentSpell.Name+"  de "+Adversaire.currentSpell.ConstDamage+" de damage @@@@@@@@@");
							if(Adversaire.currentSpell.ConstDamage==10)
							{
								//Debug.LogWarning("@@@@@@@@@ Si je reduit tout !!! @@@@@@@@@");
								//Adversaire.currentSpell = null;
								if(currentSpell.IdSpell == 102){//Contre de type war
									Spells s = new Spells(69,"ContreDamage","Contre",0,1,10,10,new int [2]{0,0},0,0,"",null,false);
									Adversaire.subitAction(ref s);//un spell a 10 damages de base
								}
								if(currentSpell.IdSpell == 202){//Contre de type Wiz
									addShield(10);
								}
							}
						}
					}
				}
				
				//Si le sort est instant ou canaliser
				//
				if(currentSpell.Instant==0 || currentSpell.Instant==1){
					GainRessource(currentSpell.Gain);
					Debug.LogWarning("Le "+nom+" realise une action de type "+currentSpell.Type+", "+currentSpell.Name+" frappe a "+currentSpell.Damage+" de dommage ca lui coute "+currentSpell.Cost+" de ressource il lui reste "+this.nbRessource+" de ressource");
					//Si ulti du war
					//
					if(currentSpell.IdSpell==108){
						currentSpell.Damage = currentSpell.Damage+(int)(this.NbRessource/2);
						this.NbRessource = 0;
					}
					if(currentSpell.Type=="Interrupt" && Adversaire.currentSpell!=null){
						//Debug.LogWarning("Le "+nom+" interrupt le sort "+Adversaire.currentSpell.Name+" de l'adversaire.("+currentSpell.Type+")");
						Adversaire.currentSpell.IsInterrupt = true;
						if(currentSpell.IdSpell==206){//Si le spell est l'interruption du wizard alors on lui administre 10 point de barriere
							shield = shield + 10;
						}
					}
				}
				return true;
			}
			else{//Sort interrupt
				Debug.LogWarning("Le "+nom+" ne fait pas l'action, son sort "+currentSpell.Name+" est interrompu, soit par l'adversaire soit par manque de ressource");
				return false;	
			}
		}
		else 
			return false;	
	}
	public void subitAction(ref Spells spell){
		if(spell.Damage>0){
			if(spell.Instant != 2 ){//ne fait pas de degat en tant que dot ici
				//Debug.LogWarning("subitAction "+spell.Name);
				this.PerdrePV(spell.Damage);
				if(currentSpell!=null){
					if(currentSpell.Type != "Contre"){//Il faut qu'il soit différent de contre pour qu'on puisse le comparé apres, et donc de pas le mettre a null
						//Debug.LogWarning("currentSpell.Type != Contre||||||||||||| Attention je met le sort "+spell.Name+" a null ||||||||||||||||||||");
						//spell = null;
					}
				}
				else{
					//Debug.LogWarning("currentSpell!=null||||||||||||| Attention je met le sort "+spell.Name+" a null ||||||||||||||||||||");
					//spell = null;
				}
			}
		}
	}
	public void subitAction(Spells spell, int DamageDot){
		if(spell!=null){
			if(!spell.IsInterrupt){
				this.PerdrePV(DamageDot);
			}
		}
		Debug.LogWarning("Le "+nom+" prend "+DamageDot+" de dommage de dot");
	}
	public void PerdrePV(int degatRecu){
		if(Shield > 0){
			Shield = Shield - degatRecu;
			degatRecu = 0;
			if(Shield<0){
				degatRecu = Mathf.Abs(Shield);
				Shield=0;
			}
		}
		//On perd des pv
		//
		if(pv>0){
			pv = pv-degatRecu;
		}
		if(pv<0){
			pv=0;
		}
	}
	public void GainPV(int GainPv){
		//On perd des pv
		//
		if(pv<=pvMax){
			pv = pv+GainPv;
		}
		if(pv>pvMax){
			pv=pvMax;
		}
	}
	public void GainRessource(int GainRessource){
		int NbRessourceMax = 100;
		//Dans le cas du voleur et wizard les sort for un gain de 0 donc change rien
		//
		if(nbRessource<=NbRessourceMax){
			nbRessource = nbRessource+GainRessource;
		}
		if(nbRessource>NbRessourceMax){
			nbRessource=NbRessourceMax;
		}
	}
	public void addShield(int nbShieldToAdd){
		this.shield = this.shield + nbShieldToAdd;
		if(this.shield >= MaxShield){
			this.shield = MaxShield;
		}
	}
	public virtual void EndRound(){
		Debug.LogWarning("BEBEBEBEBEEBBEEB");
	}
	public override string ToString ()
	{
		return string.Format ("[Personnage: Id={0}, Nom={1}, Pv={2},Bouclier={4}, NbRessource={3}]", Id, Nom, Pv, Shield, NbRessource);
	}
}